$(function(){
	$('div.error-message:visible')
		.live('mouseover.validacion mouseout.validacion', function(e){
			$msg = $(this).siblings('.validar-error:first');
			switch(e.type){
				case 'mouseover':
					$msg.show();
					break;
				case 'mouseout':
					$msg.hide();
					break;
			}
		});

	$('div.error-message')
		.parent().find(':input:first').before('<div class="error-message" style="display:inline-block; cursor:pointer; font-weight:bold; font-size: 1.5em;">*</div>').end().end()
		.each(function(){
			html = this.innerHTML;
			$(this).attr('style','position:absolute;z-index:100;padding:0px; display:none;').addClass('ui-corner-all validar-error error-message ui-state-error').html('<ul style="margin:3px 4px 3px -14px><li>'+ html +'</li></ul>');
		});
});

var ADCValidate = {
	defaultValidateInputs : function(){return $(':text, textarea, select.select_one').filter('.word, .number, .integer, .decimal, .notEmpty, .date, [minlength], [greaterthan], [lessthan], [between], [dateformat], select.select_one, [dependent]');},
	errores : {},
	errorCount : 0,
	validationRules : {
		'word' : function(input){
			el = $(input);
			word = el.val();
			state = true;
			spchars = '.-/*+_<>!"\'$%&()=?¿[]{} ';
			spchars_arr = spchars.split('');
			for(i=0, j=spchars_arr.length; i<j; i++){
				if(word.split(spchars_arr[i]).length>1){
					state=false;
					break;
				}
			}
			return state;
		},
		'number' : function(input){
			//valor = $(input).val().replace(/[0-9]/g,'').replace(/\./,'');
			valor = $(input).val().replace(/^-/,'').replace(/[0-9]/g,'').replace(/\./,'');
			return (valor === '');
		},
		'integer' : function(input){
			return ($(input).val().replace(/[0-9]/g,'') === '');
			//return (/^[0-9]+$/).test($(input).val());
		},
		'decimal' : function(input){
			return (/^0\.([0-9]+)?/).test($(input).val());
		},
		'notEmpty' : function(input){
			return $(input).val().trim().length?true:false;
		},
		'minLength' : function(input,minLength){
			return $(input).val().length >= minLength;
		},
		'greaterThan' : function(input,greaterThan){
			return ($(input).val()-0) > greaterThan;
		},
		'lessThan' : function(input,lessThan){
			return ($(input).val()-0) < lessThan;
		},
		'between' : function(input, lowerLimit, upperLimit){
			val = ($(input).val() -0);
			return (val>=lowerLimit) && (val<=upperLimit);
		}
	},
	borrarErrores : function($inputs){
		if(typeof $inputs == 'undefined'){
			$inputs = ADCValidate.defaultValidateInputs();
		} else if(typeof $inputs == 'string'){
			$inputs = $($inputs);
		}
		if(!$inputs.length){
			return false;
		}
		for(var i in ADCValidate.errores){
			if(ADCValidate.errores.hasOwnProperty(i)){
				for(var j=0, k=$inputs.length; j<k; j++){
					if(i == $inputs[j].id && /form\-error/.test($inputs[j].getAttribute('class'))){
						ADCValidate.errores[i] = {};
						ADCValidate.errorCount--;
						$($inputs[j]).removeClass('form-error').siblings('.error-message').remove();
					}
				}
			}
		}

		//ADCValidate.errores = {};
		//ADCValidate.errorCount = 0;
		// $('div.error-message').remove();
		// $('.form-error').removeClass('form-error');
	},
	//$inputs (jQuery, string, undefined)
	validarInputs : function ($inputs){
		//ADCValidate.borrarErrores();
		if(typeof $inputs == 'undefined'){
			$inputs = ADCValidate.defaultValidateInputs();
		} else if(typeof $inputs == 'string'){
			$inputs = $($inputs);
		}
		if(!$inputs.length){
			return false;
		}
		//inicializando objeto de errores
		for(var i=0, j=$inputs.length; i<j; i++){
			ADCValidate.errores[$inputs[i].id] = {};
		}
		//contador de errores a cero
		ADCValidate.errorCount = 0;

		//word
		//no puede contener caracteres especiales, solo una palabra
		$validate_word = $inputs.filter('.word');
		for (i=0, j=$validate_word.length; i<j;  i++){
			if($validate_word[i].value.length === 0){continue;}
			if (!ADCValidate.validationRules.word($validate_word[i])){
				ADCValidate.errores[$validate_word[i].id].word = true;
				ADCValidate.errorCount++;
			}
		}

		//number
		$validate_number = $inputs.filter('.number');
		for(i=0, j=$validate_number.length; i<j; i++){
			if($validate_number[i].value.length === 0) {continue;}
			//if(!/^[0-9]+(\.[0-9]+)?/.test($validate_number[i].value)){
			//if(isNaN(parseFloat($validate_number[i].value - 0))){
			if(!ADCValidate.validationRules.number($validate_number[i])){
				ADCValidate.errores[$validate_number[i].id].number = true;
				ADCValidate.errorCount++;
			}
		}

		//integer
		$validate_integer = $inputs.filter('.integer');
		for(i=0, j=$validate_integer.length; i<j; i++){
			if($validate_integer[i].value.length === 0) {continue;}
			//if(!/^[0-9]+$/.test($validate_integer[i].value)){
			if(!ADCValidate.validationRules.integer($validate_integer[i])){
				ADCValidate.errores[$validate_integer[i].id].integer=true;
				ADCValidate.errorCount++;
			}
		}

		//decimal
		$validate_decimal = $inputs.filter('.decimal');
		for(i=0, j=$validate_decimal.length; i<j; i++){
			if($validate_decimal[i].value.length === 0) {continue;}
			if(!ADCValidate.validationRules.decimal($validate_decimal[i])){
				ADCValidate.errores[$validate_decimal[i].id].decimal=true;
				ADCValidate.errorCount++;
			}
		}

		//notEmpty
		$validate_notEmpty = $inputs.filter('.notEmpty');
		for(i=0, j=$validate_notEmpty.length; i<j; i++){
			if(!ADCValidate.validationRules.notEmpty($validate_notEmpty[i])){
				ADCValidate.errores[$validate_notEmpty[i].id].notEmpty=true;
				ADCValidate.errorCount++;
			}
		}

		//date
		//validacion de fecha tipo dd/mm/yyyy incluyendo 00/00/0000
		//para otros formatos ver [dateformat]
		$validate_date = $inputs.filter('.date');
		for(i=0, j=$validate_date.length; i<j; i++){
			if($validate_date[i].value.length === 0) {continue;}
			if(!/((0[1-9]|[12][0-9]|3[01])\/(0[1-9]|1[012])\/(19|20)[0-9]{2}|(00\/00\/0000))/.test($validate_date[i].value)){
				ADCValidate.errores[$validate_date[i].id].date=true;
				ADCValidate.errorCount++;
			}
		}

		//minlength
		$validate_minlength = $inputs.filter('[minlength]');
		for(i=0, j=$validate_minlength.length; i<j; i++){
			if($validate_minlength[i].value.length === 0) {continue;}
			$input = $validate_minlength.eq(i);
			if(!ADCValidate.validationRules.minLength($input, $input.attr('minlength'))){
				ADCValidate.errores[$validate_minlength[i].id].minlength=true;
				ADCValidate.errorCount++;
			}
		}

		//greaterthan
		$validate_greaterthan = $inputs.filter('[greaterthan]');
		for(i=0, j=$validate_greaterthan.length; i<j; i++){
			if ($validate_greaterthan[i].value.length === 0) {continue;}
			$input = $validate_greaterthan.eq(i);
			if(!ADCValidate.validationRules.greaterThan($input, ($input.attr('greaterthan')-0))){
				ADCValidate.errores[$validate_greaterthan[i].id].greaterthan=true;
				ADCValidate.errorCount++;
			}
		}

		//lessthan
		$validate_lessthan = $inputs.filter('[lessthan]');
		for(i=0, j=$validate_lessthan.length; i<j; i++){
			if ($validate_lessthan[i].value.length === 0) {continue;}
			$input = $validate_lessthan.eq(i);
			if(!ADCValidate.validationRules.lessThan($input, ($input.attr('lessthan')-0))){
				ADCValidate.errores[$validate_lessthan[i].id].lessthan=true;
				ADCValidate.errorCount++;
			}
		}

		//between
		//fomato: between="15,1500"
		$validate_between = $inputs.filter('[between]');
		for(i=0, j=$validate_between.length; i<j; i++){
			if($validate_between[i].value.length === 0) {continue;}
			$input = $validate_between.eq(i);
			between = $input.attr('between').replace(/\s+/g,'').split(',');
			if(!ADCValidate.validationRules.between($input, (between[0]-0), (between[1]-0))){
				ADCValidate.errores[$validate_between[i].id].between=true;
				ADCValidate.errorCount++;
			}
		}

		//dateformat
		//formato: dateformat="dd/mm/yyyy"  o  dateformat="mm-dd-yyyy" o cualquier combinacion mm dd yyyy con simbolos - y /
		$validate_dateformat = $inputs.filter('[dateformat]');
		for(i=0, j=$validate_dateformat.length; i<j; i++){
			if($validate_dateformat[i].value.length === 0) {continue;}
			dateformat = $($validate_dateformat).attr('dateformat');
			if(dateformat.indexOf('/')>-1){
				dateformat = dateformat.replace(/\//g, '\\/');
			}else if(dateformat.indexOf('-')>-1){
				dateformat = dateformat.replace(/\-/g, '\\-');
			}else{
				continue;
			}

			dateformat = '/' + dateformat.replace('dd', '((0[1-9]|[12][0-9]|3[01])').replace('mm', '(0[1-9]|1[012])').replace('yyyy', '(19|20)[0-9]{2})') + '/';
			if(!eval(dateformat).test($validate_dateformat[i].value)){
				ADCValidate.errores[$validate_dateformat[i].id].dateformat=true;
				ADCValidate.errorCount++;
			}
		}

		//select.select_one
		//el valor seleccionado no debe ser 0 o ''
		$validate_select_one = $inputs.filter('select.select_one');
		for(i=0, j=$validate_select_one.length; i<j; i++){
			if($validate_select_one[i].value == '0' || $validate_select_one[i].value.trim() === ''){
				ADCValidate.errores[$validate_select_one[i].id].selectone = true;
				ADCValidate.errorCount++;
			}
		}

		//dependent
		//el valor del campo depende de que otro tenga valor
		$validate_dependent = $inputs.filter('[dependent]');
		for(i=0, j=$validate_dependent.length; i<j; i++){
			indep_field = $('#'+$validate_dependent.eq(i).attr('dependent'));
			if(!(indep_field.length && indep_field.val().trim().length)){
				ADCValidate.errores[$validate_dependent[i].id].dependent = true;
				ADCValidate.errorCount++;
			}
		}

		return ADCValidate.errorCount?true:false;
	},
	//options (undefined, string = alerta|next|both, object = {showAlerta:false, showNext:true})
	verErrores : function (options){
		var _options = {
			showAlerta:false,	//muestra alerta con todos los errores
			showNext:true		//muestra el error después del control
		};
		if(typeof options == 'undefined'){
			options = {showAlerta:true, showNext:true};
		}else if(typeof options == 'string'){
			switch (options){
				case 'alerta':
					options = {showAlerta:true, showNext:false};
					break;
				case 'next':
					options = {showAlerta:false, showNext:true};
					break;
				case 'both':
					options = {showAlerta:true, showNext:true};
					break;
				default:
					options = _options;
			}
		} else if(typeof options=='object'){
			options = $.extend({}, _options, options);
		} else {
			options = _options;
		}
		if(ADCValidate.errorCount){
			if(options.showAlerta){
				str_error = '<ul>';
				for(var i in ADCValidate.errores){
					if(ADCValidate.errores.hasOwnProperty(i)){
						item_error = '';
						el = $('#'+i);
						for(var j in ADCValidate.errores[i]){
							if(ADCValidate.errores[i].hasOwnProperty(j)){
								switch (j){
									case 'word':
										item_error += '<li>Solo una palabra</li>';
										break;
									case 'number':
										item_error += '<li>Debe ser número</li>';
										break;
									case 'integer':
										item_error += '<li>Debe ser entero</li>';
										break;
									case 'decimal':
										item_error += '<li>Debe ser decimal sin valor entero</li>';
										break;
									case 'notEmpty':
										item_error += '<li>Debe tener un valor</li>';
										break;
									case 'date':
										item_error += '<li>Debe ser fecha (dd/mm/yyyy)</li>';
										break;
									case 'minlength':
										item_error += '<li>Debe tener '+ el.attr('minlength') +' caracteres</li>';
										break;
									case 'greaterthan':
										item_error += '<li>Debe ser mayor a '+ el.attr('greaterthan') +'</li>';
										break;
									case 'lessthan':
										item_error += '<li>Debe ser menor a '+ el.attr('lessthan') +'</li>';
										break;
									case 'between':
										between = el.attr('between').split(',');
										item_error += '<li>Debe estar entre '+ between[0] +' y '+ between[1] +'</li>';
										break;
									case 'dateformat':
										item_error += '<li>Debe ser fecha ('+ el.attr('dateformat') +')</li>';
										break;
									case 'selectone':
										item_error += '<li>Debe seleccionar un valor</li>';
										break;
									case 'dependent':
										item_error += '<li>Debe ingresar valor en el campo relacionado</li>';
										break;
								}
							}
						}
						if(item_error.length){
							str_error += '<li><b>'+ i.replace(/([A-Z]+)/g, ' $1').replace(/^( )/, '') +'</b><ul>'+ item_error +'</ul></li>';
						}
					}

				}
				str_error += '</ul>';
				if(typeof alerta =='function'){
					alerta(str_error, 'ADCSoft::Validacion', 3500);
				} else {
					$('<div>'+ str_error +'</div>').dialog({
						'title': 'ADCSoft::Validacion',
						'position': 'top',
						'modal':true
					});
				}

			}
			if(options.showNext){
				for(i in ADCValidate.errores){
					if(ADCValidate.errores.hasOwnProperty(i)){
						str_error = '';
						el = $('#'+i);
						for(j in ADCValidate.errores[i]){
							if(ADCValidate.errores[i].hasOwnProperty(j)){
								switch (j){
									case 'word':
										str_error += '<li>Solo una palabra</li>';
										break;
									case 'number':
										str_error += '<li>Debe ser número</li>';
										break;
									case 'integer':
										str_error += '<li>Debe ser entero</li>';
										break;
									case 'decimal':
										str_error += '<li>Debe ser decimal sin valor entero</li>';
										break;
									case 'notEmpty':
										str_error += '<li>Debe tener un valor</li>';
										break;
									case 'date':
										str_error += '<li>Debe ser fecha (dd/mm/yyyy)</li>';
										break;
									case 'minlength':
										str_error += '<li>Debe tener '+ el.attr('minlength') +' caracteres</li>';
										break;
									case 'greaterthan':
										str_error += '<li>Debe ser mayor a '+ el.attr('greaterthan') +'</li>';
										break;
									case 'lessthan':
										str_error += '<li>Debe ser menor a '+ el.attr('lessthan') +'</li>';
										break;
									case 'between':
										between = el.attr('between').split(',');
										str_error += '<li>Debe estar entre '+ between[0] +' y '+ between[1] +'</li>';
										break;
									case 'dateformat':
										str_error += '<li>Debe ser fecha ('+ el.attr('dateformat') +')</li>';
										break;
									case 'selectone':
										str_error += '<li>Debe seleccionar un valor</li>';
										break;
									case 'dependent':
										str_error += '<li>Debe ingresar valor en el campo relacionado</li>';
										break;
								}
							}
						}
						if (str_error.length){
							str_error = '<div class="error-message" style="display:inline-block; cursor:pointer; font-weight:bold; font-size: 1.5em;">*</div><div class="ui-corner-all validar-error error-message ui-state-error" style="position:absolute; z-index:100;padding:0px; display:none;"><ul style="margin:3px 4px 3px -14px">'+ str_error +'</ul></div>';
							el.addClass('form-error').before(str_error);
						}
					}
				}
			}
		}
	}
};

/*
//por implementar
regla_default = {regla:'mensaje'};
reglas = {
	inputId1:[{regla1:'mensaje'},'regla2'],
	inputId2:[{regla2:'mensaje'}],
	inputId3:['regla1','regla2'],
	inputId4:'regla1'
}
*/